import java.util.LinkedList;

/**
 * 
 * <p>
 *     <b>
 *         Classe abstraite Emetteur servant a factoriser le code commun aux differentes classes qui en heritent
 *     </b>
 * </p>
 * 
 * @author Jean-Loup TAILLEFUMIRE 
 * @author Ronan LOUZAOUEN
 * @author Boubacar SOLLY
 * @author Vincent LEBRIS
 * @date septembre - octobre 2012
 *
 */
public abstract class Emetteur extends Transmetteur<Boolean,Float>  {
	protected float tempsBit;
	protected int nbEchParBit;
	protected float amplitudeMin;
	protected float amplitudeMax;
	protected float periodeEch;
	protected float tempsMontee;
	protected float tempsDescente;
	protected float penteMontee;
	protected float penteDescente;
	//protected float PsignalEmis;
	
	public static final int NRZ_ONDE_RECTANGULAIRE = 0;
	public static final int NRZ_ONDE_TRAPEZOIDALE = 1;
	public static final int RZ_ONDE_IMPULSIONNELLE = 2;
	
	/**
	 * Pour construire un emetteur
	 * @param nbEchParBit le nombre d'echatillons par bit
	 * @param amplitudeMin l'amplitude min
	 * @param amplitudeMax l'amplitude max
	 */
	public Emetteur(int nbEchParBit, float amplitudeMin, float amplitudeMax){
		tempsBit = 1;//temps bit normalise
		this.nbEchParBit = nbEchParBit;
		this.amplitudeMax = amplitudeMax;
		this.amplitudeMin = amplitudeMin;
		this.periodeEch = tempsBit / nbEchParBit;//intervalle de temps entre chaque echantillon
		
		//les montee et descentes pour chaque bit code representent chacune 1/3 du temps bit
		this.tempsMontee = tempsBit/3f;
		this.tempsDescente = tempsMontee;
		
		this.penteMontee = (amplitudeMax - amplitudeMin) / tempsMontee;
		this.penteDescente = (amplitudeMin - amplitudeMax) / tempsDescente;
		//PsignalEmis=0.0f;
	}
	
	/**
	 * Pour echantillonner les segments de droite qui seront passes en parametre
	 * Cette methode sert a la creation des symboles des emetteur NRZ.
	 * 
	 * @param penteDroite la pente de la droite a echantillonner
	 * @param ordonneeOrigineDroite l'ordonnee a l'origine de la droite a echantillonner
	 */
	protected Information<Float> echantilloner(float penteDroite, float ordonneeOrigineDroite){
		Information<Float> signalEchantillone = new Information<Float>();
		float t = 0f;
		
		for(int i = 0 ; i < (nbEchParBit / 3) ; i++) {
			signalEchantillone.add(penteDroite * t + ordonneeOrigineDroite);
			t += periodeEch;
	    }
		
		return signalEchantillone;
	}
	
	/**
	 * Pour concatener une liste d'information issue du codage de chaque bit par l'emetteur.
	 * 
	 * @param listeInformations Contient l'ensemble des informations issues du codage de chaque bit par l'emetteur
	 * @return Information contenant l'ensemble des bits codes concatenes
	 */
	protected Information<Float> concatener(LinkedList<Information<Float>> listeInformations){
		Information<Float> informationsConcatenees = new Information<Float>();
		
		for(Information<Float> inf : listeInformations){
			for(int i = 0 ; i < inf.nbElements() ; i++){
				informationsConcatenees.add(inf.iemeElement(i));
			}
		}
		
		return informationsConcatenees;
	}
	

}
